package org.example.utils;

import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.UUID;

/**
 * 统一的文件上传工具类
 * 处理图片上传并返回统一的访问URL
 */
@Component
public class FileUploadUtil {

    // 基础路径配置
    private static final String BASE_UPLOAD_DIR = "static/image";
    private static final String QUESTION_DIR = "question";
    private static final String ARTICLE_DIR = "article";
    
    // 允许的文件类型
    private static final String[] ALLOWED_EXTENSIONS = {"jpg", "jpeg", "png", "gif"};
    
    // 最大文件大小 (5MB)
    private static final long MAX_FILE_SIZE = 5 * 1024 * 1024;
    
    /**
     * 上传问题图片
     * @param file 要上传的文件
     * @return 可访问的URL路径
     * @throws Exception 上传过程中的异常
     */
    public String uploadQuestionImage(MultipartFile file) throws Exception {
        return uploadFile(file, QUESTION_DIR);
    }
    
    /**
     * 上传文章图片
     * @param file 要上传的文件
     * @return 可访问的URL路径
     * @throws Exception 上传过程中的异常
     */
    public String uploadArticleImage(MultipartFile file) throws Exception {
        return uploadFile(file, ARTICLE_DIR);
    }
    
    /**
     * 通用文件上传方法
     * @param file 要上传的文件
     * @param subDir 子目录名称
     * @return 可访问的URL路径
     * @throws Exception 上传过程中的异常
     */
    private String uploadFile(MultipartFile file, String subDir) throws Exception {
        // 检查文件是否为空
        if (file.isEmpty()) {
            throw new IllegalArgumentException("文件为空");
        }
        
        // 检查文件名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null) {
            throw new IllegalArgumentException("无效的文件名");
        }
        
        // 检查文件类型
        String ext = StringUtils.getFilenameExtension(originalFilename);
        if (ext == null || !isAllowedExtension(ext)) {
            throw new IllegalArgumentException("仅支持jpg、jpeg、png、gif格式");
        }
        
        // 检查文件大小
        if (file.getSize() > MAX_FILE_SIZE) {
            throw new IllegalArgumentException("文件大小不能超过5MB");
        }
        
        // 生成唯一文件名
        String newFileName = UUID.randomUUID().toString() + "." + ext;
        
        // 确保上传目录存在
        String uploadDir = BASE_UPLOAD_DIR + "/" + subDir;
        ensureDirectoryExists(uploadDir);
        
        // 保存文件
        Path targetPath = Paths.get(uploadDir, newFileName);
        Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
        
        // 返回访问URL
        return "/image/" + subDir + "/" + newFileName;
    }
    
    /**
     * 确保目录存在，如果不存在则创建
     * @param directory 目录路径
     * @throws Exception 目录创建失败时抛出异常
     */
    private void ensureDirectoryExists(String directory) throws Exception {
        File dir = new File(directory);
        if (!dir.exists()) {
            boolean created = dir.mkdirs();
            if (!created) {
                throw new Exception("无法创建目录: " + directory);
            }
        }
    }
    
    /**
     * 检查文件扩展名是否在允许列表中
     * @param extension 文件扩展名
     * @return 是否允许
     */
    private boolean isAllowedExtension(String extension) {
        String lowerExt = extension.toLowerCase();
        for (String allowed : ALLOWED_EXTENSIONS) {
            if (allowed.equals(lowerExt)) {
                return true;
            }
        }
        return false;
    }
} 